home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / src / stkmem.c < prev    next >
C/C++ Source or Header  |  1992-10-22  |  2KB  |  101 lines

  1. /* Alloca simulation
  2.  */
  3.  
  4. #include "scheme.h"
  5.  
  6. extern char *malloc();
  7.  
  8. char *Safe_Malloc (size) unsigned size; {
  9.     char *ret;
  10.  
  11.     if ((ret = malloc (size)) == 0)
  12.     Primitive_Error ("not enough memory to malloc ~s bytes",
  13.         Make_Fixnum (size));
  14.     return ret;
  15. }
  16.  
  17. #ifndef USE_ALLOCA
  18.  
  19. MEM_NODE *Mem_List;
  20.  
  21. char *Mem_Alloc (size) unsigned size; {
  22.     char *ret;
  23.  
  24.     if ((ret = malloc (size)) == 0)
  25.     Fatal_Error ("not enough memory to malloc %u bytes", size);
  26.     return ret;
  27. }
  28.  
  29. Free_Mem_Nodes (first) MEM_NODE *first; {
  30.     MEM_NODE *p;
  31.  
  32.     while (p = first) {
  33.     first = first->next;
  34.     if (--p->refcnt == 0)
  35.         free ((char *)p);
  36.     }
  37. }
  38.  
  39. Save_Mem_Nodes (cont) Object cont; {
  40.     unsigned sum = 0;
  41.     char *s;
  42.     MEM_NODE *p;
  43.     Object str;
  44.     GC_Node;
  45.  
  46.     CONTROL(cont)->memlist = Mem_List;
  47.     for (p = Mem_List; p; p = p->next)
  48.     sum += p->len;
  49.     GC_Link (cont);
  50.     str = Make_String ((char *)0, sum);
  51.     CONTROL(cont)->memsave = str;
  52.     GC_Unlink;
  53.     for (p = Mem_List, s = STRING(str)->data; p; s += p->len, p = p->next) {
  54.     bcopy ((char *)(p+1), s, p->len);
  55.     p->refcnt++;
  56.     }
  57. }
  58.  
  59. Restore_Mem_Nodes (cont) Object cont; {
  60.     MEM_NODE *p;
  61.     char *s;
  62.     Object str;
  63.  
  64.     Free_Mem_Nodes (Mem_List);
  65.     Mem_List = CONTROL(cont)->memlist;
  66.     str = CONTROL(cont)->memsave;
  67.     for (p = Mem_List, s = STRING(str)->data; p; s += p->len, p = p->next) {
  68.     p->refcnt++;
  69.     bcopy (s, (char *)(p+1), p->len);
  70.     }
  71. }
  72.  
  73. Object Save_GC_Nodes () {
  74.     Object vec;
  75.     register unsigned sum = 0, i = 0, n;
  76.     register GCNODE *p;
  77.  
  78.     for (p = GC_List; p; p = p->next)
  79.     sum += p->gclen <= 0 ? 1 : p->gclen-1;
  80.     vec = Make_Vector (sum, Null);
  81.     for (p = GC_List; p; p = p->next, i += n) {
  82.     n = p->gclen <= 0 ? 1 : p->gclen-1;
  83.     bcopy ((char *)p->gcobj, (char *)&(VECTOR(vec)->data[i]),
  84.         n * sizeof (Object));
  85.     }
  86.     return vec;
  87. }
  88.  
  89. Restore_GC_Nodes (vec) Object vec; {
  90.     register i = 0, n;
  91.     register GCNODE *p;
  92.  
  93.     for (p = GC_List; p; p = p->next, i += n) {
  94.     n = p->gclen <= 0 ? 1 : p->gclen-1;
  95.     bcopy ((char *)&(VECTOR(vec)->data[i]), (char *)p->gcobj,
  96.         n * sizeof (Object));
  97.     }
  98. }
  99.  
  100. #endif
  101.